unit unDM;

interface

uses
 SysUtils, Dialogs, IniFiles, Buttons, Controls, Forms, Classes, KDaoDataBase, DB, KDaoTable;

type
 Tdm = class(TDataModule)
  tabEventos: TKADaoTable;
  Conexao: TKADaoDatabase;
  tabPilotos: TKADaoTable;
  tabPilotosidpiloto: TAutoIncField;
  tabPilotosNome: TStringField;
  tabPilotosDataNascimento: TDateTimeField;
  tabPilotosEquipe: TIntegerField;
  tabEventosidevento: TAutoIncField;
  tabEventosEvento: TStringField;
  tabEventosData: TDateTimeField;
  tabEventosPrimeiro: TIntegerField;
  tabEventosSegundo: TIntegerField;
  tabEventosTerceiro: TIntegerField;
  tabEventosQuarto: TIntegerField;
  tabEventosQuinto: TIntegerField;
  tabEventosSexto: TIntegerField;
  tabEventosSetimo: TIntegerField;
  tabEventosOitavo: TIntegerField;
  sqlTemp: TKADaoTable;
  tabPontuacao: TKADaoTable;
  tabPontuacaoidpiloto: TIntegerField;
  tabPontuacaoidevento: TIntegerField;
  tabPontuacaoPontos: TIntegerField;
  tabPontuacaoPosicao: TIntegerField;
  sqlAcumulado: TKADaoTable;
  sqlPontuacao: TKADaoTable;
  sqlPontuacaoNome: TStringField;
  sqlPontuacaoSomaDePontos: TFloatField;
  tabPilotosPontos: TIntegerField;
  tabEventosFinalizada: TBooleanField;
  tabPontuacaoPeso: TIntegerField;
  sqlPontuacaoSomaDePeso: TFloatField;
  tabPontuacaoAcumulado: TIntegerField;
  tabDetalhePontuacao: TKADaoTable;
  tabDetalhePontuacaoidevento: TIntegerField;
  tabDetalhePontuacaoData: TDateTimeField;
  tabDetalhePontuacaoEvento: TStringField;
  tabDetalhePontuacaoPontos: TIntegerField;
  tabDetalhePontuacaoidpiloto: TAutoIncField;
  sqlPontuacaoidpiloto: TAutoIncField;
  sqlEventos: TKADaoTable;
  sqlEventosidevento: TIntegerField;
  sqlEventosEvento: TStringField;
  sqlEventosData: TDateTimeField;
  sqlEventosPrimeiro: TIntegerField;
  sqlEventosSegundo: TIntegerField;
  sqlEventosTerceiro: TIntegerField;
  sqlEventosQuarto: TIntegerField;
  sqlEventosQuinto: TIntegerField;
  sqlEventosSexto: TIntegerField;
  sqlEventosSetimo: TIntegerField;
  sqlEventosOitavo: TIntegerField;
  sqlEventosFinalizada: TBooleanField;
  tabDetalhePontuacaoPosicao: TIntegerField;
  sqlEventosNono: TIntegerField;
  sqlEventosDecimo: TIntegerField;
  sqlEventosDecimoPrimeiro: TIntegerField;
  sqlEventosDecimoSegundo: TIntegerField;
  sqlEventosDecimoTerceiro: TIntegerField;
  sqlEventosDecimoQuarto: TIntegerField;
  sqlEventosDecimoQuinto: TIntegerField;
  sqlEventosDecimoSexto: TIntegerField;
  tabEventosNono: TIntegerField;
  tabEventosDecimo: TIntegerField;
  tabEventosDecimoPrimeiro: TIntegerField;
  tabEventosDecimoSegundo: TIntegerField;
  tabEventosDecimoTerceiro: TIntegerField;
  tabEventosDecimoQuarto: TIntegerField;
  tabEventosDecimoQuinto: TIntegerField;
  tabEventosDecimoSexto: TIntegerField;
  tabDetalhePontuacaoPeso: TIntegerField;
  tabDetalhePontuacaoPenalidade: TIntegerField;
  tabPontuacaoPenalidade: TIntegerField;
  tabPenalizacoes: TKADaoTable;
  tabPenalizacoesidevento: TIntegerField;
  tabPenalizacoesidpiloto: TIntegerField;
  tabPenalizacoesnome: TStringField;
  tabPenalizacoesPenalidade: TIntegerField;
  procedure DataModuleCreate(Sender: TObject);
 private
  { Private declarations }
 public
  procedure AtualizarPontos(idevento: integer);
  { Public declarations }
 end;
 
var
 dm: Tdm;
 
implementation

uses UnfmAbreBancoDeDados;

{$R *.dfm}

procedure Tdm.DataModuleCreate(Sender: TObject);
var
 IniFile: TIniFile;
const
 INI_FILE = 'GTRCalendario.ini';
begin
 Conexao.Connected := False;
 
 IniFile := TIniFile.Create(ExtractFilePath(Application.ExeName) + INI_FILE);
 IniFile.WriteString('Aplicacao', 'Executavel', Application.ExeName);
 
 
 if FileExists(IniFile.ReadString('BancoDeDados', 'Caminho', ExtractFilePath(Application.ExeName) + 'GTRCalendario.mdb')) then
  begin
   Conexao.Database := IniFile.ReadString('BancoDeDados', 'Caminho', ExtractFilePath(Application.ExeName) + 'GTRCalendario.mdb');
   Conexao.Connected := True;
  end
 else
  begin
   fmAbreBancoDeDados := TfmAbreBancoDeDados.Create(Self);
   if fmAbreBancoDeDados.ShowModal = mrOK then
    begin
     Conexao.Database := IniFile.ReadString('BancoDeDados', 'Caminho', '');
     Conexao.Connected := True;
    end;
   fmAbreBancoDeDados.Free;
  end;
 
 IniFile.Free;
end;

procedure Tdm.AtualizarPontos(idevento: integer);
begin
 dm.sqlTemp.SQL.Clear;
 dm.sqlTemp.SQL.Text := 'DELETE FROM pontuacao WHERE idevento=:idevento';
 dm.sqlTemp.Params.ParamByName('idevento').Value := idevento;
 dm.sqlTemp.ExecuteSQL;
 
 dm.sqlEventos.Close;
 dm.sqlEventos.SQL.Clear;
 dm.sqlEventos.SQL.Text := 'SELECT * FROM eventos where Finalizada=True and idevento=:idevento ORDER BY idevento';
 dm.sqlEventos.Params.ParamByName('idevento').Value := idevento;
 dm.sqlEventos.Open;
 dm.sqlEventos.First;
 while not dm.sqlEventos.Eof do
  begin


   dm.tabPontuacao.Open;

   dm.tabPilotos.Open;
   dm.tabPilotos.First;
   while not dm.tabPilotos.Eof do
    begin
     dm.tabPontuacao.Append;

     dm.sqlTemp.Close;
     dm.sqlTemp.SQL.Clear;
     dm.sqlTemp.SQL.Text := 'SELECT Sum(Penalidade) as PenalSoma from Penalizacoes WHERE idpiloto=:IDPILOTO and idevento=:IDEVENTO';
     dm.sqlTemp.Params[0].AsInteger := dm.tabPilotosidpiloto.Value;
     dm.sqlTemp.Params[1].AsInteger := dm.sqlEventosidevento.Value;
     dm.sqlTemp.Open;

     dm.tabPontuacaoPenalidade.Value := dm.sqlTemp.FieldByName('PenalSoma').AsInteger;
     //ShowMessage(IntToStr(dm.tabPontuacaoPenalidade.Value));

     dm.sqlTemp.Close;
     dm.sqlTemp.SQL.Clear;
     dm.sqlTemp.SQL.Text := 'SELECT sum(Pontos-Penalidade) as total,sum(Peso) as pesototal from Pontuacao WHERE idpiloto=' + IntToStr(dm.tabPilotosidpiloto.Value);
     dm.sqlTemp.Open;



     if dm.tabPilotosidpiloto.Value = dm.sqlEventosPrimeiro.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosPrimeiro.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 20;
       dm.tabPontuacaoPosicao.Value := 1;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       if dm.sqlTemp.FieldByName('pesototal').AsInteger < 120 then
        if (dm.sqlTemp.FieldByName('pesototal').AsInteger + 60) > 120 then
         dm.tabPontuacaoPeso.Value := abs(dm.sqlTemp.FieldByName('pesototal').AsInteger - 120)
        else
         dm.tabPontuacaoPeso.Value := 60;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosSegundo.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosSegundo.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 17;
       dm.tabPontuacaoPosicao.Value := 2;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       if dm.sqlTemp.FieldByName('pesototal').AsInteger < 120 then
        if (dm.sqlTemp.FieldByName('pesototal').AsInteger + 40) > 120 then
         dm.tabPontuacaoPeso.Value := abs(dm.sqlTemp.FieldByName('pesototal').AsInteger - 120)
        else
         dm.tabPontuacaoPeso.Value := 40;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosTerceiro.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosTerceiro.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 15;
       dm.tabPontuacaoPosicao.Value := 3;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       if dm.sqlTemp.FieldByName('pesototal').AsInteger < 120 then
        if (dm.sqlTemp.FieldByName('pesototal').AsInteger + 30) > 120 then
         dm.tabPontuacaoPeso.Value := abs(dm.sqlTemp.FieldByName('pesototal').AsInteger - 120)
        else
         dm.tabPontuacaoPeso.Value := 30;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosQuarto.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosQuarto.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 13;
       dm.tabPontuacaoPosicao.Value := 4;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       if (dm.sqlTemp.FieldByName('pesototal').AsInteger > 0) then
        if (dm.sqlTemp.FieldByName('pesototal').AsInteger - 20) < 0 then
         begin
          dm.tabPontuacaoPeso.Value := (dm.sqlTemp.FieldByName('pesototal').AsInteger - 20);
          dm.tabPontuacaoPeso.Value := dm.tabPontuacaoPeso.Value + abs(dm.tabPontuacaoPeso.Value);
         end
        else
         dm.tabPontuacaoPeso.Value := -20;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosQuinto.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosQuinto.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 12;
       dm.tabPontuacaoPosicao.Value := 5;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       if (dm.sqlTemp.FieldByName('pesototal').AsInteger > 0) then
        if (dm.sqlTemp.FieldByName('pesototal').AsInteger - 30) < 0 then
         begin
          dm.tabPontuacaoPeso.Value := (dm.sqlTemp.FieldByName('pesototal').AsInteger - 30);
          dm.tabPontuacaoPeso.Value := dm.tabPontuacaoPeso.Value + abs(dm.tabPontuacaoPeso.Value);
         end
        else
         dm.tabPontuacaoPeso.Value := -30;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosSexto.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosSexto.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 11;
       dm.tabPontuacaoPosicao.Value := 6;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       if (dm.sqlTemp.FieldByName('pesototal').AsInteger > 0) then
        if (dm.sqlTemp.FieldByName('pesototal').AsInteger - 30) < 0 then
         begin
          dm.tabPontuacaoPeso.Value := (dm.sqlTemp.FieldByName('pesototal').AsInteger - 30);
          dm.tabPontuacaoPeso.Value := dm.tabPontuacaoPeso.Value + abs(dm.tabPontuacaoPeso.Value);
         end
        else
         dm.tabPontuacaoPeso.Value := -30;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosSetimo.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosSetimo.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 10;
       dm.tabPontuacaoPosicao.Value := 7;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosOitavo.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosOitavo.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 9;
       dm.tabPontuacaoPosicao.Value := 8;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosNono.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosNono.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 8;
       dm.tabPontuacaoPosicao.Value := 9;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosDecimo.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosDecimo.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 7;
       dm.tabPontuacaoPosicao.Value := 10;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosDecimoPrimeiro.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosDecimoPrimeiro.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 6;
       dm.tabPontuacaoPosicao.Value := 11;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosDecimoSegundo.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosDecimoSegundo.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 5;
       dm.tabPontuacaoPosicao.Value := 12;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosDecimoTerceiro.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosDecimoTerceiro.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 4;
       dm.tabPontuacaoPosicao.Value := 13;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosDecimoQuarto.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosDecimoQuarto.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 3;
       dm.tabPontuacaoPosicao.Value := 14;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosDecimoQuinto.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosDecimoQuinto.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 2;
       dm.tabPontuacaoPosicao.Value := 15;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       //dm.tabPontuacao.Post;
      end
     else if dm.tabPilotosidpiloto.Value = dm.sqlEventosDecimoSexto.Value then
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.sqlEventosDecimoSexto.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 1;
       dm.tabPontuacaoPosicao.Value := 16;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       //dm.tabPontuacao.Post;
      end
     else
      begin
       //dm.tabPontuacao.Append;
       dm.tabPontuacaoidpiloto.Value := dm.tabPilotosidpiloto.Value;
       dm.tabPontuacaoidevento.Value := dm.sqlEventosidEvento.Value;
       dm.tabPontuacaoPontos.Value := 0;
       dm.tabPontuacaoAcumulado.Value := dm.sqlTemp.FieldByName('total').AsInteger + dm.tabPontuacaoPontos.Value - dm.tabPontuacaoPenalidade.Value;
       //dm.tabPontuacao.Post;
      end;

     dm.tabPontuacao.Post;
     dm.tabPilotos.Next;
    end;
   dm.tabPontuacao.Close;
   dm.sqlEventos.Next;
  end;
end;

end.

